package cn.sprouting.tool;

import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.sprouting.model.PhoneCode;
import cn.sprouting.model.common.Constant;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 电话号码
 * 电话号码的构成除了前面的3位，中间的四位与所在地有关，故而，随机生成的电话并不一定真实有效，本工具类生成的电话号码只能通过简单的验证，并不一定完全有效
 *
 * @Date 创建时间： 2021/11/3. 16:08
 * @Author ：LX
 * 地点：长沙麓谷
 * 备注说明：
 */
public class RandomTelephoneTool {

    /**
     * 移动前缀
     * 2G/3G号段：134，135，136，137，138，139，150，151，152，158，159，182，183，184
     * 3G上网卡：147
     * 4G号段：178，184
     */
    private static final String[] CMCC = new String[] {"134","135","136","137","138","139","150","151","152","157","158","159","187","188"};
    /**
     * 联通前缀
     * 2G/3G号段：130，131，132，155，156，185，186
     * 3G上网卡：145
     * 4G号段：176，185
     */
    private static final String[] CUCC = new String[] {"130","131","132","155","156","185","186","145"};
    /**
     * 电信前缀
     * 中国电信 2G/3G号段：133，153， 180，181，189
     * 4G号段：173， 177
     */
    private static final String[] CTCC = new String[] {"133","153","180","181","189"};


    /**
     * 随机生成手机号码
     * @return
     */
    public static String getTelephone(){
        return getTelephone(1, null).get(0);
    }

    /**
     * 随机生成手机号码
     * @param num 生成数量
     * @return
     */
    public static List<String> getTelephone(Integer num){
        return getTelephone(num, null);
    }

    /**
     * 随机生成手机号码
     * @param num 生成的数量
     * @param operatorList 运营商类型，比如 CMCC 之类的 {@link Constant.Operator}
     * @return
     */
    public static List<String> getTelephone(Integer num, List<String> operatorList){
        // 最终使用的前缀类型
        List<String> pre = new ArrayList<>();
        if (operatorList != null && operatorList.size() > 0){
            for (String operator : operatorList){
                if (Constant.Operator.CMCC.equals(operator)){
                    pre.addAll(Arrays.asList(CMCC));
                } else if (Constant.Operator.CUCC.equals(operator)){
                    pre.addAll(Arrays.asList(CUCC));
                } else if (Constant.Operator.CTCC.equals(operator)){
                    pre.addAll(Arrays.asList(CTCC));
                }
            }
        }

        // 最终结果集
        List<String> resultList = new ArrayList<>();
        if (pre.size() == 0){
            return resultList;
        }

        if (num == null || num < 1){
            num = 1;
        }

        for (int i = 0; i < num; i ++){
            String random = RandomUtil.randomInt(0, 8) + "";
            String phone = RandomUtil.randomEle(pre) + StrUtil.fillBefore(random, '0', 8);
            resultList.add(phone);
        }

        return resultList;
    }


    /**
     * 随机生成固话号码
     * @param num 生成数量
     * @param province 指定生成的省，比如 湖南、广东 ,不填则默认随机全部
     * @param delimiter 区号和电话的分隔符，默认使用 -
     * @return
     */
    public static List<String> getFixedTelephone(Integer num, String province, String delimiter){
        String phoneCode = ResourceUtil.readUtf8Str("phoneCode.txt");
        List<PhoneCode> phoneCodeList = JSONUtil.toList(phoneCode, PhoneCode.class);

        // 随机的区号
        List<String> codeList = new ArrayList<>();
        if (StrUtil.isNotEmpty(province)){
            // 过滤对应的省份
            String provinceStr = province.replace("省", "").replace("市", "").replace("自治区", "");
            phoneCodeList.stream().filter(obj -> provinceStr.equals(obj.getArea())).forEach(obj -> codeList.addAll(obj.getCode()));

        } else {
            phoneCodeList.stream().map(PhoneCode::getCode).forEach(codeList::addAll);
        }
        if (codeList.size() == 0){
            return null;
        }

        if (num == null || num < 1){
            num = 1;
        }
        if (StrUtil.isEmpty(delimiter)){
            delimiter = "-";
        }

        List<String> saveList = new ArrayList<>();
        for (int i = 0; i < num; i ++){
            saveList.add(RandomUtil.randomEle(codeList) + delimiter + RandomUtil.randomLong(10000000L, 99999999L));
        }

        return saveList;
    }

    /**
     * 随机生成固话号码
     * @param num 生成数量
     * @param province 指定生成的省，比如 湖南、广东 ,不填则默认随机全部
     * @return
     */
    public static List<String> getFixedTelephone(Integer num, String province){
        return getFixedTelephone(num, province, null);
    }

    /**
     * 随机生成固话号码
     * @param num 生成数量
     * @return
     */
    public static List<String> getFixedTelephone(Integer num){
        return getFixedTelephone(num, null, null);
    }

    /**
     * 随机生成固话号码
     * @return
     */
    public static String getFixedTelephone(){
        List<String> list = getFixedTelephone(1, null, null);
        if (list == null || list.size() == 0){
            return null;
        }
        return list.get(0);
    }


}
